# coding:utf8
import url_manager, html_downloader, url_parser, html_outputer
import time

class SpiderMain(object):
    def __init__(self):
        self.urls = url_manager.UrlManager()  # url管理器类
        self.downloader = html_downloader.HtmlDownloader()  # html下载器类
        self.parser = url_parser.HtmlParser()  # url解析器类
        self.outputer = html_outputer.HtmlOutputer()  # html输出类

    def craw(self, root_url):
        count=1                                             #限制爬取的数量
        self.urls.add_new_url(root_url)  # 第一次运行爬虫时先把首个url加入url管理器
        print "Star crawing:http://acm.scau.edu.cn:8000/uoj/register/displayActivity.html?id=29&page=1"
        while self.urls.has_new_url():  # 当url管理器里没有新的url就结束爬虫
            try:
                new_url = self.urls.get_new_url()  # 获取新的url
                html_cont,getcode = self.downloader.download(new_url)  # 下载目标html
                new_url, new_data = self.parser.parser(new_url, html_cont)  # 把下载好的html已经当前url放入解释器 返回新的url和筛选出来的数据
                self.urls.add_new_url(new_url)  # 把新的url添加到url管理器中
                self.outputer.collect_data(new_data)   # 把返回的数据放进html输出类的收集器中
            except:
                print new_url
                print getcode
                print "craw fail"
            time.sleep(1)                    #延时执行，由于页面的防刷新限制
        self.outputer.output_html()  # 输出
        time.sleep(1)
if __name__ == "__main__":
    root_url = ["http://acm.scau.edu.cn:8000/uoj/register/displayActivity.html?id=29&page=1"]
    obj_spider = SpiderMain()
    obj_spider.craw(root_url)
